# -*- coding:utf-8 -*-
__author__   = 'tommy'
__license__  = 'htcharge.com@2016-10-27'
__version__  = 'v1.0.0'

print "**************************************************************************"
print "********************                                   *******************"
print "********************   ThriftServer For App v1.0.0     *******************"
print "********************                                   *******************"
print "********************           Tommy@2016              *******************"
print "********************                                   *******************"
print "**************************************************************************"

import urllib2

import socket, traceback, sys, json
import HTCHttp, HTCUtils, HTCMsg
import random,time
import qwaterdb,umans,qcfg,INIUtils,qwater,printer
sys.path.append('./gen-py')

from YLWWater import YLWWater
from YLWWater.ttypes import *

from urllib import urlencode
from thrift import TMultiplexedProcessor
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from thrift.server import TServer,TProcessPoolServer

K_API_HOST  = 'http://127.0.0.1:8081'
K_WEB_PORT  = 65527
K_WORK_SIZE = 10

class YLWWaterHandler:

    


    #*********************************************
    #***打印小票
    #***参数：
    #    aOrderNum:    订单号
    #*********************************************
    def dealPrint(self, aOrderNum):
        HTCUtils.rctLogger.info("******** dealPrint *********")
        try:
            tmpSaleno = str(aOrderNum)
            HTCUtils.rctLogger.info("params=" + ",saleno=" + tmpSaleno )
            tmpDBorderPrint = qwaterdb.dbSelectGetOrderPrint(tmpSaleno)
            if (tmpDBorderPrint == -1):
                return HTCMsg.msgError(-2, "数据库访问出错")
            if (tmpDBorderPrint == 0):
                return HTCMsg.msgError(-2, "打印次数为空")
            return HTCMsg.msgOk();
        except Exception, e:
            HTCUtils.rctLogger.error(e)
        return HTCMsg.msgError(-3, HTCUtils.K_ERR_SERVER)
 
    

    #*********************************************
    #***获取账单详情
    #***参数：
    #    aOrderNum:    订单号
    #*********************************************
    def reqDealDetail(self, aOrderNum):
        HTCUtils.rctLogger.info("******** reqDealDetail *********")
        try:
            tmpSaleno = str(aOrderNum)
            HTCUtils.rctLogger.info("params=" + ",saleno=" + tmpSaleno )
            tmpDBorderMsg = qwaterdb.dbSelectGetOrderMsg(tmpCard,tmpIndx)
            return HTCMsg.msgOrderMsg(tmpDBorderMsg)
        except Exception, e:
            HTCUtils.rctLogger.error(e)
        return HTCMsg.msgError(-3, HTCUtils.K_ERR_SERVER)
    
    

    #*********************************************
    #***获取账单列表
    #***参数：
    #    aCard:    卡号
    #    aIdx:     客户端已获取到的条数
    #*********************************************
    def reqListOfDeal(self, aCard, aIdx):
        HTCUtils.rctLogger.info("******** reqListOfDeal *********")
        try:
            tmpCard = str(aCard)
            tmpIndx = str(aIdx)
            HTCUtils.rctLogger.info("params=" + ",card=" + tmpCard + ",index=" + tmpIndx )
            tmpDBorder = qwaterdb.dbSelectGetOrderList(tmpCard,tmpIndx)
            if (tmpDBorder == 0):
                return HTCMsg.msgError(1, "没有更多啦")
            return HTCMsg.msgOrderList(tmpDBorder)
        except Exception, e:
            HTCUtils.rctLogger.error(e)
        return HTCMsg.msgError(-3, HTCUtils.K_ERR_SERVER)


    #*********************************************
    #***获取用户个人信息
    #***参数：
    #    aCard:   卡号
    #*********************************************
    def reqUserInfo(self, aCard):
        HTCUtils.rctLogger.info("******** reqUserInfo *********")
        try:
            tmpCard      = str(aCard)
            
            HTCUtils.rctLogger.info("params=" + ",card=" + tmpCard )
            tmpDBInfos = qwaterdb.dbSelectGetCardInfos(tmpCard)
            if (tmpDBInfos == -1):
                return HTCMsg.msgError(-2, "数据库访问出错")
            return HTCMsg.msgCardInfos(tmpDBInfos)
            return HTCMsg.msgError(-1, HTCUtils.K_ERR_ERRCODE)
        except Exception, e:
            HTCUtils.rctLogger.error(e)
        return HTCMsg.msgError(-3, HTCUtils.K_ERR_SERVER)




    #*********************************************
    #***停止加水
    #***参数：
    #    aCard:   卡号
    #    aNum:    设备编号
    #*********************************************
    def stopWater(self, aCard, aNum):
        HTCUtils.rctLogger.info("******** stopWater *********")
        try:
            tmpCard      = str(aCard)
            tmpNum       = str(aNum)
            HTCUtils.rctLogger.info("params=" + ",card=" + tmpCard +",num=" + tmpNum )
            if HTCUtils.isEmpty(tmpCard) or HTCUtils.isEmpty(tmpNum):
                return HTCMsg.msgError(-1, HTCUtils.K_ERR_PARAMS)
                
            tmpDBmsnmacrecv = qwaterdb.dbSelectGetMsnMac(tmpCard,tmpNum)
            if (tmpDBmsnmacrecv == -1):
                return HTCMsg.msgError(-2, "dbSelectGetMsnMac出错")
            tmpMsn = tmpDBmsnmacrecv.split("&v;")[0]
            tmpMac = tmpDBmsnmacrecv.split("&v;")[1]
            qwaserc = qwater.cmdStatus(tmpMsn,tmpMac)
            if (qwaserc == -1):
                return HTCMsg.msgError(-2, "设备离线无法关闭")
            
            dev_status = qwaserc.split("|")[0]
            dev_value  = qwaserc.split("|")[1]
            if (dev_status == '0'):
                return HTCMsg.msgError(-2, "设备离线无法关闭")
            
            qwaterrecv = qwater.cmdStop(tmpMsn,tmpMac)
            if (qwaterrecv == 0):
                return HTCMsg.msgOk();
            if (qwaterrecv == -1):
                return HTCMsg.msgError(-2, "关闭失败")
            return HTCMsg.msgError(-2, "请联系管理")
        except Exception, e:
            HTCUtils.rctLogger.error(e)
        return HTCMsg.msgError(-3, HTCUtils.K_ERR_SERVER)



    #*********************************************
    #***开始加水
    #***参数：
    #    aCard:   卡号
    #    aNum:    设备编号
    #*********************************************
    def startWater(self, aCard, aNum):
        HTCUtils.rctLogger.info("******** startWater *********")
        try:
            tmpCard      = str(aCard)
            tmpNum       = str(aNum)
            HTCUtils.rctLogger.info("params=" + ",card=" + tmpCard +",num=" + tmpNum )
            if HTCUtils.isEmpty(tmpCard) or HTCUtils.isEmpty(tmpNum):
                return HTCMsg.msgError(-1, HTCUtils.K_ERR_PARAMS)
                
            tmpDBmsnmacrecv = qwaterdb.dbSelectGetMsnMac(tmpCard,tmpNum)
            if (tmpDBmsnmacrecv == -1):
                return HTCMsg.msgError(-2, "dbSelectGetMsnMac出错")
            tmpMsn = tmpDBmsnmacrecv.split("&v;")[0]
            tmpMac = tmpDBmsnmacrecv.split("&v;")[1]
            qwaserc = qwater.cmdStatus(tmpMsn,tmpMac)
            if (qwaserc == -1):
                return HTCMsg.msgError(-2, "设备离线无法开启")
            
            dev_status = qwaserc.split("|")[0]
            dev_value  = qwaserc.split("|")[1]
            if (dev_status == '0'):
                return HTCMsg.msgError(-2, "设备离线无法开启")
            
            qwaterrecv = qwater.cmdStart(tmpMsn,tmpMac)
            if (qwaterrecv == 0):
                return HTCMsg.msgOk();
            if (qwaterrecv == -1):
                return HTCMsg.msgError(-2, "开启失败")
            return HTCMsg.msgError(-2, "请联系管理")
        except Exception, e:
            HTCUtils.rctLogger.error(e)
        return HTCMsg.msgError(-3, HTCUtils.K_ERR_SERVER)
        
        
        

    #*********************************************
    #***获取单个设备信息
    #***参数：
    #    aNum:    设备编号
    #*********************************************
    def reqDevInfo(self ,aCard, aNum):
        HTCUtils.rctLogger.info("******** reqDevInfo *********")
        try:
            tmpCard      = str(aCard)
            tmpNum       = str(aNum)
            HTCUtils.rctLogger.info("params=" + ",card=" + tmpCard +",num=" + tmpNum )
            if HTCUtils.isEmpty(tmpCard) or HTCUtils.isEmpty(tmpNum):
                return HTCMsg.msgError(-1, HTCUtils.K_ERR_PARAMS)
            tmpDBmsnmacrecv = qwaterdb.dbSelectGetMsnMac(tmpCard,tmpNum)
            if (tmpDBmsnmacrecv == -1):
                return HTCMsg.msgError(-2, "1数据库访问出错")
            if (tmpDBmsnmacrecv == -2):
                return HTCMsg.msgError(-2, "不存在此设备")
            tmpMsn = tmpDBmsnmacrecv.split("&v;")[0]
            tmpMac = tmpDBmsnmacrecv.split("&v;")[1]
            qwaserc = qwater.cmdStatus(tmpMsn,tmpMac)
            if (qwaserc == -1):
                dev_status = 1
                dev_value  = 0
            else:
                dev_status = qwaserc.split("|")[0]
                dev_value  = qwaserc.split("|")[1]
                if (dev_status == '0'):
                    dev_status = 1
                    dev_value  = 0
                
            tmpDBOneDev = qwaterdb.dbSelectGetOneDevice(tmpCard,tmpNum,'0')
            if (tmpDBOneDev == -1):
                return HTCMsg.msgError(-2, "2数据库访问出错")
            return HTCMsg.msgOneDev(tmpDBOneDev,dev_status,dev_value)
        except Exception, e:
            HTCUtils.rctLogger.error(e)
        return HTCMsg.msgError(-3, HTCUtils.K_ERR_SERVER)

 
     
    #*********************************************
    #***获取设备列表（根据经纬度）
    #***参数：
    #    aLat:    维度
    #    aLon:    经度   
    #*********************************************
    def reqListOfDevByLoc(self, aCard,aLat,aLon):
        HTCUtils.rctLogger.info("******** reqListOfDevByLoc *********")
        try:
            tmpCard     = str(aCard)
            tmpLat      = str(aLat)
            tmpLon      = str(aLon)
            HTCUtils.rctLogger.info("params=" + ",card=" + tmpCard + ",lat=" + tmpLat + ",lon=" + tmpLon)
            if HTCUtils.isEmpty(tmpLat) or HTCUtils.isEmpty(tmpLon):
                return HTCMsg.msgError(-1, HTCUtils.K_ERR_PARAMS)
            tmpDBLonLatInfos = qwaterdb.dbSelectGetLonLatList(tmpLon,tmpLat)
            if (tmpDBLonLatInfos == -1):
                return HTCMsg.msgError(-3, "数据库访问出错")
            if (tmpDBLonLatInfos == '0'):
                return HTCMsg.msgError(-2, "卡号不存在")
            if (tmpDBLonLatInfos == '-1'):
                return HTCMsg.msgError(-2, "传入参数为空")
            if (tmpDBLonLatInfos == '-2'):
                return HTCMsg.msgError(-2, "当前卡被禁用")
            if (tmpDBLonLatInfos == '-3'):
                return HTCMsg.msgError(-2, "当前卡被挂失")
            if (tmpDBLonLatInfos == '-4'):
                return HTCMsg.msgError(-2, "当前卡不存卡")
            if (tmpDBLonLatInfos == '-11'):
                return HTCMsg.msgError(-2, "没有未结束的账单")
                
            
            return HTCMsg.msgLatLonList(tmpCard,tmpDBLonLatInfos)
        except Exception, e:
            HTCUtils.rctLogger.error(e)
        return HTCMsg.msgError(-3, HTCUtils.K_ERR_SERVER)
    
    
    #*********************************************
    #***获取设备列表（使用列表）
    #***参数：
    #    aCard:   卡号
    #*********************************************
    def reqListOfDev(self, aCard):
        HTCUtils.rctLogger.info("******** reqListOfDev *********")
        try:
            tmpCard      = str(aCard)
            HTCUtils.rctLogger.info("params=" + ",card=" + tmpCard)
            if HTCUtils.isEmpty(tmpCard):
                return HTCMsg.msgError(-1, HTCUtils.K_ERR_PARAMS)
            tmpDBUsingInfos = qwaterdb.dbSelectGetUsingList(tmpCard)

            if (tmpDBUsingInfos == -1):
                return HTCMsg.msgError(-3, "数据库访问出错")
            if (tmpDBUsingInfos == '-1'):
                return HTCMsg.msgError(-2, "传入参数为空")
            if (tmpDBUsingInfos == '-2'):
                return HTCMsg.msgError(-2, "当前卡被禁用")
            if (tmpDBUsingInfos == '-3'):
                return HTCMsg.msgError(-2, "当前卡被挂失")
            if (tmpDBUsingInfos == '-4'):
                return HTCMsg.msgError(-2, "当前卡不存卡")
                
            tmpDBmsnmacrecv = qwaterdb.dbSelectGetMsnMac(tmpCard,'0')
            if (tmpDBmsnmacrecv == -1):
                return HTCMsg.msgError(-2, "数据库访问出错")
            tmpMsn = tmpDBmsnmacrecv.split("&v;")[0]
            tmpMac = tmpDBmsnmacrecv.split("&v;")[1]
            
            return HTCMsg.msgUsingList(tmpMsn,tmpDBUsingInfos)
        except Exception, e:
            HTCUtils.rctLogger.error(e)
        return HTCMsg.msgError(-3, HTCUtils.K_ERR_SERVER)


    #*********************************************
    #***用户登录
    #***参数：
    #    aCard:      卡号
    #    aCode:      短信验证码
    #    aOsType:    系统类型
    #*********************************************
    def doLogin(self, aCard, aCode, aOsType):
        HTCUtils.rctLogger.info("******** doLogin *********")
        try:
            tmpCard     = str(aCard)
            tmpCode     = str(aCode)
            tmpOs       = str(aOsType)
            HTCUtils.rctLogger.info("params=" + ",card=" + tmpCard +",code=" + tmpCode + ",os=" + tmpOs)
            if HTCUtils.isEmpty(tmpCard) or HTCUtils.isEmpty(tmpCode):
                return HTCMsg.msgError(-1, HTCUtils.K_ERR_PARAMS)
            #暂时 不用pan duan验证码
            tmpINIrecv = INIUtils.INIread(tmpCard)
            if (tmpINIrecv == -1):
                return HTCMsg.msgError(-1, HTCUtils.K_ERR_ERRCODE)
            else:
                if ((int(time.time()) - int(tmpINIrecv.split("./.")[1])) > 300):
                    return HTCMsg.msgError(-1, HTCUtils.K_ERR_ERRCODE)
            #return HTCMsg.msgOk();
            if (tmpCode == str(tmpINIrecv.split("./.")[0])):
                tmpDBInfos = qwaterdb.dbSelectGetCardInfos(tmpCard)
                #HTCUtils.rctLogger.info("getcardinfos=" + tmpDBInfos)
                if (tmpDBInfos == -1):
                    return HTCMsg.msgError(-2, "数据库访问出错")
                return HTCMsg.msgCardInfos(tmpDBInfos)
                #return HTCMsg.msgError(-1, HTCUtils.K_ERR_ERRCODE)

            return HTCMsg.msgError(-1, HTCUtils.K_ERR_ERRCODE)
        except Exception, e:
            HTCUtils.rctLogger.error(e)
        return HTCMsg.msgError(-3, HTCUtils.K_ERR_SERVER)


    #*********************************************
    #***获取验证码
    #***参数：
    #    aCard: 卡号
    #*********************************************
    def reqCode(self, aCard):
        HTCUtils.rctLogger.info("******** reqCode *********")
        try:
            tmpCard = str(aCard)
            HTCUtils.rctLogger.info("params=" + ",card=" + tmpCard)
            if HTCUtils.isEmpty(tmpCard) :
                return HTCMsg.msgError(-1, HTCUtils.K_ERR_PARAMS)
            #通过卡号，获取手机号,如果不存在卡号，返回0,卡号挂失1,卡号禁用2
            tmpDBInfos = qwaterdb.dbSelectGetPhone(tmpCard)
            HTCUtils.rctLogger.info("get_phone_number =" + tmpDBInfos)
            if (tmpDBInfos == -1):
                return HTCMsg.msgError(-3, "数据库访问出错")
            if (tmpDBInfos == '0'):
                return HTCMsg.msgError(-2, "卡号不存在")
            if (tmpDBInfos == '-1'):
                return HTCMsg.msgError(-2, "传入参数为空")
            if (tmpDBInfos == '-2'):
                return HTCMsg.msgError(-2, "当前卡被禁用")
            if (tmpDBInfos == '-3'):
                return HTCMsg.msgError(-2, "当前卡被挂失")
            if (tmpDBInfos == '-4'):
                return HTCMsg.msgError(-2, "当前卡不存卡")
            if (tmpDBInfos == '-5'):
                return HTCMsg.msgError(-2, "主卡卡被禁用")
            if (tmpDBInfos == '-6'):
                return HTCMsg.msgError(-2, "主卡卡被挂失")
            if (tmpDBInfos == '-7'):
                return HTCMsg.msgError(-2, "主卡卡不存卡")
            
            tmpINIrecv = INIUtils.INIread(tmpCard)
            if (tmpINIrecv == -1):
                randomNum = random.randint(1000,9999)
                umans.httpSMS(tmpDBInfos,str(randomNum))
                INIUtils.INIwrite(tmpCard,randomNum)
            else:
                if ((int(time.time()) - int(tmpINIrecv.split("./.")[1])) > 300):
                    randomNum = random.randint(1000,9999)
                    umans.httpSMS(tmpDBInfos,str(randomNum))
                    INIUtils.INIwrite(tmpCard,randomNum)
                else:
                    umans.httpSMS(tmpDBInfos,str(tmpINIrecv.split("./.")[0]))

            return HTCMsg.msgOk();
        except Exception, e:
            HTCUtils.rctLogger.error(e)
        return HTCMsg.msgError(-3, HTCUtils.K_ERR_SERVER)
    

        
HTCUtils.rctLogger.info("------Created ThriftServer")
tmpProcessor = TMultiplexedProcessor.TMultiplexedProcessor()
handler   = YLWWaterHandler()
tmpProcessor.registerProcessor("YLWWater", YLWWater.Processor(handler))

HTCUtils.rctLogger.info("------Start ThriftServer")
tmpTransport   = TSocket.TServerSocket(port=K_WEB_PORT)
tmpTfactory    = TTransport.TBufferedTransportFactory()
tmpPfactory    = TBinaryProtocol.TBinaryProtocolFactory()

tmpServer      = TProcessPoolServer.TProcessPoolServer(tmpProcessor, tmpTransport, tmpTfactory, tmpPfactory) #7.5ms
tmpServer.setNumWorkers(K_WORK_SIZE)

#tmpServer      = TServer.TForkingServer(tmpProcessor, tmpTransport, tmpTfactory, tmpPfactory) #6.6
#tmpServer      = TServer.TThreadedServer(tmpProcessor, tmpTransport, tmpTfactory, tmpPfactory)
#tmpServer      = TServer.TThreadPoolServer(tmpProcessor, tmpTransport, tmpTfactory, tmpPfactory)
#tmpServer      = TServer.TThreadedSelectorServer(tmpProcessor, tmpTransport, tmpTfactory, tmpPfactory)
HTCUtils.rctLogger.info("------ThriftServer Doing...")
tmpServer.serve()
HTCUtils.rctLogger.info("------ThriftServer done!")

